﻿#include <QFile>
#include <QDomDocument>

#include "CfgReader.h"
#include "LogInfo.h"

CfgReader::CfgReader()
    : m_pLogInfo(nullptr)
{
    init();
}

CfgReader::~CfgReader()
{
    delete m_pLogInfo;
    m_pLogInfo = nullptr;
}

void CfgReader::init()
{
    m_pLogInfo = new LogInfo();
    readFile();
}

void CfgReader::readFile()
{
    QFile file("../config/log_config.xml");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return;
    }
    QDomDocument doc;
    QByteArray buffText = file.readAll();
	QString errorMsg;
	int errorLine;
	int errorColumn;
    if (!doc.setContent(buffText.trimmed(), &errorMsg, &errorLine, &errorColumn))
    {
        return;
    }

    QDomElement docElem = doc.documentElement();
    QString strCfgRoot = docElem.tagName();
    if (strCfgRoot != "config")
    {
        return;
    }

    QDomNodeList listNodes = docElem.childNodes();

    for (int i = 0; i < listNodes.count(); ++i)
    {
        QDomNode node = listNodes.item(i);

        // 注释
        if (QDomNode::CommentNode == node.nodeType())
        {
            //qInfo() << node.nodeName();
            continue;
        }
        // 日志
        else if (node.nodeName() == "log")
        {
            parseLog(node.toElement());
        }
    }
}
// 解析日志配置信息
void CfgReader::parseLog(const QDomElement& element)
{
    // 判断是否是日志节点
    if (element.nodeName() != "log")
    {
        return;
    }
    // 日志开关状态
    QString strEnable = element.attribute("enable");
    if (strEnable.toLower() == "true")
    {
        m_pLogInfo->setEnable(true);
    }
    else
    {
        m_pLogInfo->setEnable(false);
    }
    // 日志等级
    QDomNodeList nodes = element.childNodes();
    for (int i = 0; i < nodes.count(); ++i)
    {
        QDomNode node = nodes.item(i);
        // 注释节点
        if (QDomNode::CommentNode == node.nodeType())
        {
            continue;
        }
        if (node.nodeName() == "level")
        {
            QString strVal = node.toElement().text();
            if (strVal.isEmpty())
            {
                m_pLogInfo->setLogLevel(0);
            }
            else
            {
                m_pLogInfo->setLogLevel(strVal.toInt());
            }
        }
        else if (node.nodeName() == "size")
        {
            QString strVal = node.toElement().text();
            if (strVal.isEmpty())
            {
                m_pLogInfo->setLogFileSize(10);
            }
            else
            {
                m_pLogInfo->setLogFileSize(strVal.toInt());
            }
        }
		else if (node.nodeName() == "file_count")
		{
			QString strVal = node.toElement().text();
			if (strVal.isEmpty())
			{
				m_pLogInfo->setFileCount(5);
			}
			else
			{
				if (strVal.toInt() < 1)
				{
					m_pLogInfo->setFileCount(1);
				}
				else
				{
					m_pLogInfo->setFileCount(strVal.toInt());
				}
			}
		}
    }
}

LogInfo* CfgReader::getLogInfo()
{
    return m_pLogInfo;
}
